import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5
import Interaction 1.0
import QtQml 2.2

Window {
    id:root

    flags: Qt.Window | Qt.WindowTitleHint   // 让窗口不显示右上角的那三个按钮
    title:"PracticeTyping"

    visible: true
    width: 860
    height: 700

    property int taskID: 0  // 任务球球的 ID 计数器（重要）
    // onceGeneratedQuantity 用于存储任务球球一次生成的数量
    property int onceGeneratedQuantity:1
    property int taskTotal:20   // 总共要生成的任务球
    property int createdTask: 0 // 已生成的任务球

    property int eliminatedQuantity:0   // 已消除的任务球数量
    property int uneliminatedQuantity:0 // 未消除的任务球数量
    property int missesNum:0    // 失误次数


    // C++ 中的交互对象
    Interaction{
        id:interaction
        currentScreenHeight: root.height
        currentScreenWidth: root.width

    }


    // 设置一些可视控件
    Item{
        id:rootItem
        focus: true
        width: root.width
        height: root.height
        z:root.z + 1

        // 为整个窗口设置背景图片
        Image{
            id:rootBackGround
            width: rootItem.width
            source: "qrc:/Images/background.jpg"
            fillMode: Image.Tile
            z:rootItem.z - 1

        }

        // 设置一个用于静音的按钮
        MusicControl{
            id:musicControl
            z:rootItem.z+1

            anchors.right: parent.right
            anchors.rightMargin: 20
            anchors.top: parent.top
            anchors.topMargin: 10
        }

        /*
        SettingControl{
            id:settingControl
            z:rootItem.z+1

            anchors.right: musicControl.left
            anchors.rightMargin: 10
            anchors.top: parent.top
            anchors.topMargin: 10
        }
        */

        ScoreControl{
            id:scoreControl
        }

        Keys.onPressed: {
            if(event.key === Qt.Key_Shift) return;
            if(event.key === Qt.Key_Escape)
                Qt.quit();
//            console.log("pressed")
            var taskObj = findKeyTextObj(event.text);
            if(taskObj === null) return;
            taskObj.taskAnim.running = false;
        }


    }

    // 这是菜单界面
    Loader{
        id:startBoxLoader
        source: "StartBox.qml"
        active: true
        width: 300
        height: 380
        anchors.centerIn: parent

        onLoaded: {
            var startBox = startBoxLoader.item
            startBox.startGame.connect(onStartGame)
        }

    }

    // 这是结算界面
    Loader{
        id:endBoxLoader
        source: "EndBox.qml"
        active: false
        width: 300
        height: 380
        anchors.centerIn: parent

        onLoaded: {
            var endBox = endBoxLoader.item

            // 绑定 againPractise 信号
            endBox.againPractise.connect(function() {
                var type = interaction.practiceType;
                onStartGame(type);  // 使用原本的 practiceType
                resetData();
                endBoxLoader.active = false;
            });

            // 绑定 returnMenu 信号
            endBox.returnMenu.connect(function(){
                startBoxLoader.active = true;
                endBoxLoader.active = false;
                startBoxLoader.setSource("StartBox.qml");

                resetData();
            })

        }

    }



    ListModel{id:taskList}   // 用于存储动态生成的任务对象

    Timer{
        id:taskTimer
        interval: 2000
        repeat: true
        running: false
        onTriggered: {
            console.log(createdTask)
            var requireNum = onceGeneratedQuantity;
            if(createdTask >= taskTotal) {
                // 如果任务球数量迟迟不等于0，就开始判断是不是有失效的球球
                if(taskList.count !== 0) {
                    return;
                }



                taskTimer.stop();                                

                endBoxLoader.active = true;
                endBoxLoader.setSource("EndBox.qml");
                return;
            }

            // 为了防止生成的数量最终超过规定的总数
            var temp = createdTask + onceGeneratedQuantity;
            if(temp > taskTotal){
                requireNum = taskTotal - createdTask;
            }

            createTaskSphere(requireNum);
        }
    }


    // 用于开始游戏的函数
    function onStartGame(practiceType){
        console.log("游戏开始");
        var typeArr = [1,3,5];
        var totalType = [20,50,50];
        interaction.practiceType = practiceType;     // 难度类型
        onceGeneratedQuantity = typeArr[practiceType];   // 一次任务球球生成的数量
        taskTotal = totalType[practiceType]; // 设置总共的任务球球数量
//        taskTotal = 5;  // 测试用；delete
        interaction.onceGerneratedQuantity = onceGeneratedQuantity; // 传给C++的交互类

        createTaskSphere(onceGeneratedQuantity)
        taskTimer.start();  // 记得暂停
    }

    // 创建 num 个任务球体
    function createTaskSphere(num){
        for(var i=0;i!==num;++i){
            var taskObj = Qt.createComponent("GameTask.qml")
            if (taskObj.status === Component.Ready) {
                var taskItem = taskObj.createObject(rootItem, {});
                taskItem.x = interaction.getRandomX();    // 获取一个随机的 x 值，然后进行下落
                taskItem.y = interaction.getRandomY();  // 获取一个随机的 y 值
                taskItem.endY = root.height     // 设置最终的落点位置
                taskItem.imgUrl = interaction.getRandomImgUrl();    // 获取一个随机的 图片url
                taskItem.taskAnim.running = true   // 启动任务球球，让它自由下落

                var taskValue = interaction.getRandomValue();   // 获取一个任务内容
//                var taskValue = "A" // delete
                taskItem.taskText = taskValue;





                rootItem.focus = true;  // 一定要设置这个，要不然 rootItem 的焦点就被抢去了

                ++createdTask;
                taskList.append({"ID":taskID,"Obj":taskItem,"taskValue":taskValue});
                taskItem.taskID = taskID;
                taskID++;   // 更新 ID
                taskItem.ineffectiveTask.connect(ineffectiveTaskSlot);
            }
        }
    }

    // 找到按键对应的任务球球
    function findKeyTextObj(keyText){
        for(var i=0;i!==taskList.count;++i)
            if(taskList.get(i).taskValue === keyText){
                var taskObj = taskList.get(i).Obj;
                if(taskObj.y < 0) return null;  // 如果任务球球还没有出现在屏幕中，则不给删除
                taskList.remove(i);

                ++eliminatedQuantity;   // 增加一次消除数量
                scoreControl.eliminatedQuantity = eliminatedQuantity;   // 更新得分面板的值
                // 消除任务块后，启动得分面板的动画
                scoreControl.eliminatedShakeAnim.start();
                return taskObj;
            }
        ++missesNum;    // 增加一次失误次数
        scoreControl.missesNum = missesNum;   // 更新得分面板的值
        // 按键失误时，启动得分面板的动画
        scoreControl.missesNumShakeAnim.start();
        return null;
    }

    // 失效任务处理函数
    function ineffectiveTaskSlot(id){
        ++uneliminatedQuantity; // 增加一次未消除数量
        scoreControl.uneliminatedQuantity = uneliminatedQuantity;   // 更新得分面板的值

        for(var i=0;i!==taskList.count;++i){
            var currentTaskID = taskList.get(i).ID;
            console.log("currentTaskID = ",currentTaskID);
            console.log("id = ",id);
            if(currentTaskID === id){
                taskList.remove(i);
                // 未消除任务块时，启动得分面板的动画
                scoreControl.uneliminatedShakeAnim.start();
                break;
            }
        }
    }

    // 每当开始一个新的练习，都需要进行一次重置数据的操作
    function resetData(){
        // 将已生成的数量清零
        createdTask = 0;

        // 面板的数值清零
        eliminatedQuantity = 0;
        uneliminatedQuantity = 0;
        missesNum = 0;

        scoreControl.eliminatedQuantity = eliminatedQuantity;   // 更新得分面板的值
        scoreControl.uneliminatedQuantity = uneliminatedQuantity;   // 更新得分面板的值
        scoreControl.missesNum = missesNum;   // 更新得分面板的值

    }


/*
    一个逻辑，当主窗口发生变化时，暂停所有的动画，然后调整 endY 后继续启动动画
*/





}
